package com.carlinfo.usercenter.filter.back;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.carlinfo.userscenter.users.pojo.AAdmins;
import com.carlinfo.userscenter.users.pojo.AMenu;
import com.carlinfo.userscenter.users.pojo.ARoleMenu;
import com.carlinfo.userscenter.users.service.IAuthService;
import com.carlinfo.userscenter.users.service.IUsersService;
import com.carlinfo.userscenter.users.service.impl.AuthServiceImpl;
import com.carlinfo.userscenter.users.service.impl.UsersServiceImpl;
/**
 * 创建一个过滤器的步骤和servlet一样
 * 实现一个FIlter接口 
 * @author jjh
 *
 */
public class AuthBackFilter implements Filter
{

	/* 这两个对象,中的彼此引用 是null;
	 * 如果想赋值,必须调用set方法
	 *  */
	private IUsersService usersService;
	private IAuthService authService; 
	
	public AuthBackFilter()
	{
		/* 接口中木有setUsersService的方法
		 * 		~在接口中增加setUsersService
		 * 		~创建的时候就创建UsersService
		 *  */
		UsersServiceImpl usersServiceImpl = new UsersServiceImpl() ; 
		AuthServiceImpl authServiceImpl = new AuthServiceImpl() ; 
		
		
		usersServiceImpl.setAuthService(authServiceImpl);
		authServiceImpl.setUsersService(usersServiceImpl);
		
		/* 为测试类的属性赋值()Service */
		this.usersService = usersServiceImpl ;
		this.authService = authServiceImpl ; 
	}
	
	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
			throws IOException, ServletException
	{
		System.out.println(req + "==AuthBackFilter==doFilter==" + res );
		/*
		 * 虽然参数中指定的是servletrequest,但是通过运行打印发现:
		 * req就是HttpServletRequest;
		 */
		HttpServletRequest request = (HttpServletRequest) req ;
		HttpServletResponse response = (HttpServletResponse) res ;
		/*
		 * 获取session
		 * session是httpservletsession才有的方法 
		 */
		HttpSession session = request.getSession();
		/*
		 * 取票
		 * getAttribute之前,一定要确定setAttribute
		 */
		AAdmins admins = (AAdmins) session.getAttribute("adminsSess");
		System.out.println("===session中的票==" + admins);
		//RequestFacade rs = null ;
		/*	在该拦截的地方拦截了(发现游客)
		 * 
		 * 	请出示一下你的票,
		 * 		有票:sorry,知道了,玩的开心,放行
		 * 		没有票:请到大门处,补票;提供一个友好的界面
		 * 在登录提交操作，为用户发票(登录成功)
		 */
		if(admins != null)
		{
			
			/* 放行--登录成功 */
			chain.doFilter(request, response);
			//this.authVerify(chain,request,response,admins);
		}else
		{
			/* 没有票
			 *	跳转到登录页面
			 *	
			 *服务器端还是客户端
			 *
			 *补票的时候,地址栏显示的是登录界面,而不是请求界面(登录后的首页)
			 */
			String info = "您还没有登录,请先登录！！！" ;
			/*
			 * 由于是客户端跳转,两次请求,所以将信息放到四大作用域中的session(默认保持30分钟)
			 */
			session.setAttribute("info", info);
			response.sendRedirect(request.getContextPath() + "/NoLoginBackServlet?method=login" );
		}
	}

	/**
	 * 权限验证
	 * 肯定是已经登录的,就可以查询到管理员
	 * 就可以查询到角色
	 * 就可以查询到角色所对应的菜单
	 * 拿着当前访问的url和菜单中对应的url,比对,如果比对成,有权限,比对失败,没有权限
	 * @param chain
	 * @param request
	 * @param response
	 * @param admins
	 * @throws ServletException 
	 * @throws IOException 
	 */
//	private void authVerify(FilterChain chain, HttpServletRequest request, HttpServletResponse response, AAdmins admins) throws IOException, ServletException
//	{
//		/* 留后门 */
//		if(admins.getId() == 1)
//		{
//			chain.doFilter(request, response);
//			return ;
//		}
//		
//		/* 打印一下当前访问的url 
//		 * http://localhost:8080/usercenter_20180108_model2/back/AdminsBackServlet
//		 * */
//		String currUrl = request.getRequestURL() + "" ;
//		/*
//		 * 链接?后面的内容;
//		 * 如果?后面没有内容,返回的是null
//		 * mehtod=adminsList
//		 */
//		String queryStr = request.getQueryString() ;
//		/* url得拼装起来 */
//		String url = currUrl ;
//		if(queryStr != null)
//		{
//			url = url + "?" + queryStr ;
//		}
//		System.out.println("===currUrl==" + currUrl);
//		System.out.println("===queryStr==" + queryStr );
//		System.out.println("===url==" + url);
//		
//		/*
//		 * 查询角色
//		 */
//		Map<String,Object> condMap = new HashMap<String,Object>();
////		condMap.put("roleId", admins.getRoleId());
////		ARole role = this.usersService.findOneRoleService(condMap);
//		/*
//		 * 就可以查询到角色所对应的菜单
//		 * 角色如何查询角色菜单的集合,它是角色的关联关系,需要加关联开关
//		 * 角色菜单的集合不是目的:角色菜单集合中的菜单对象;菜单对象就是一个关联关系,又要查询角色菜单中的菜单对象
//		 * 
//		 * 由于关联的对象层次比较深,所以现查询;(Service封装的方法只适合一级的关联对象
//		 * 
//		 * 如果碰到二级以上的关联对象,建议现查询(重新查询一遍)
//		 * 
//		 * 查询当前角色下面所有的角色菜单,用到里面的菜单对象
//		 */
//		condMap.put("roleId", admins.getRoleId());
//		/* 由于加了关联对象 */
//		condMap.put("extend", "true");
//		/*
//		 * 由于在AuthService查询角色,用到了UserService两个相互引用
//		 * 需要通过set方法赋值(为Service的引用赋值)
//		 */
//		List<ARoleMenu> roleMenuList = this.authService.findCountListRoleMenuService(null, condMap);
//		
//		/*
//		 * 断言
//		 * 先假设结果,假设和结果不一定正确
//		 * 只能是将一段代码执行完以后才能处理结果
//		 * 
//		 * authFlag:true:表示放行,有权限
//		 * false:表示没有权限
//		 */
//		boolean authFlag = false ;
//		for (Iterator iterator = roleMenuList.iterator(); iterator.hasNext();)
//		{
//			ARoleMenu roleMenu = (ARoleMenu) iterator.next();
//			AMenu menu = roleMenu.getMenu() ;
//			System.out.println("==循环==角色菜单==" + roleMenu);
//			System.out.println("==循环==菜单======" + menu);
//			
//			/*
//			 * 菜单里面也有一个url
//			 * url存储到了数据库中
//			 * 数据库中的url是当前访问url的一部分
//			 * 如：
//			 * 数据库中的url
//			 * /back/AdminsBackServlet?method=adminsList
//			 * 当前访问的url:
//			 * http://localhost:8080/usercenter_20180108_model2/back/AdminsBackServlet?method=adminsList
//			 * 
//			 * IndexOf:查询一下url里面有没有菜单的url;返回值是菜单的url在当前访问的url中第几个位置
//			 * "abc".indexOf("a");返回值就是:0
//			 */
//			if(!"".equalsIgnoreCase(menu.getUrl()) &&
//					menu.getUrl() != null && 
//					url.indexOf(menu.getUrl()) != -1)
//			{
//				/* 说明有权限访问 
//				 * 只要找到url,就不用往下找了 */
//				authFlag = true ;
//				break ;
//			}
//		}
//		/*
//		 * 有权限访问,放行
//		 * 没有权限访问,拦截,跳转到一个合适的jsp页面上面
//		 * 
//		 * 要想知道没有权限访问,得先把循环走一遍
//		 */
//		if(authFlag)
//		{
//			chain.doFilter(request, response);
//		}else
//		{
//			/* 灭有权限访问
//			 * 客户端跳转:用户没有权限时,无法知道原来的url是什么 */
////			response.sendRedirect(request.getContextPath() + "");
//			String path = "/WEB-INF/jsp/back/auth/no_auth.jsp" ; ;
//			request.getRequestDispatcher(path).forward(request, response);
//		}
//	}

}
